package application;

import ij.process.ImageProcessor;

import java.util.ArrayList;

public class LineSegmentFitting {

	private static int stepHeight = 0;
	private static int stepwidth = 0;
	private static ImageProcessor ip = null;
	private static ImageProcessor result = null;
	
	public static ImageProcessor run(ImageProcessor image, int stepHeight,int stepWidth) {
		ip = image;
		result = ip.createProcessor(ip.getWidth(),ip.getHeight());
		LineSegmentFitting.stepHeight = stepHeight;
		LineSegmentFitting.stepwidth = stepWidth;
		for(int x=0;x < ip.getWidth();x++) {
			for (int y = 0; y < ip.getHeight(); y++) {
				ArrayList<Ligne> setOfLigne = null;
				if (ip.getPixel(x,y) == 255) {
					setOfLigne = new ArrayList<Ligne>();
					for (int k=0;k<LineSegmentFitting.stepHeight;k++){
						Ligne l = rechercheLigne(x,y+k);
						if (l!=null){
							setOfLigne.add(l);
						}
					}
					for (int k=0;k<LineSegmentFitting.stepHeight;k++){
						Ligne l = rechercheLigne(x,y-k);
						if (l!=null){
							setOfLigne.add(l);
						}
					}
					effaceLignes(setOfLigne);
					trace1Ligne(plusGrandeLigne(setOfLigne));
				}
			}
		}
		return result;
	}

	private static void trace1Ligne(Ligne l) {
		if(l.getTaille()>stepwidth){
			for(int x= l.getDebut();x<l.getFin();x++){
				result.putPixel(x,l.getY(), 255);
			}
		}
	}

	private static void effaceLignes(ArrayList<Ligne> setOfLigne) {
		for(Ligne l : setOfLigne){
			efface1Ligne(l);
		}
	}
	

	private static Ligne plusGrandeLigne(ArrayList<Ligne> setOfLigne){
		int yMin = setOfLigne.get(0).getY();
		int xMin = setOfLigne.get(0).getDebut();
		int xMax = setOfLigne.get(0).getFin();
		for(Ligne l : setOfLigne){
			if(yMin>l.getY())yMin=l.getY();
			if(xMin>l.getDebut())xMin=l.getDebut();
			if(xMax<l.getFin())xMax=l.getFin();
		}
		
		return new Ligne(yMin,xMin, xMax);
	}
	private static void efface1Ligne(Ligne l) {
		for(int i= l.getDebut();i<l.getFin();i++){
			ip.putPixel(i,l.getY(), 0);
		}
	}
	
	private static Ligne rechercheLigne(int x, int y) {
		int compteur = 0;
		int debut = x;
		int fin = x;
		while (compteur < stepwidth) {
			if (ip.getPixel(x, y) == 255) {
				x++;
				fin = x;
				compteur=0;
			} else {
				compteur++;
				x++;
			}
		}
		if(debut==1 && fin==1){
			return null;
		}else{
			Ligne l = new Ligne(y,debut,fin);
			return l;
		}
	}
}
